/**
 *
 * Classe que extrai as informações de arquivos FASTAS e cria um objeto
 * do tipo Fasta para cada arquivo.
 */
package epibot.BancoDeDados.ArmazenaDados;

import epibot.testeProteinas.JPanelTesteProteinas;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Rafael Tosta
 */
public class ProcessaFasta {

    private Scanner input;
    private String arquivoTexto = "";
    private File file;

    private ArrayList<Fasta> readRecordsMultiFasta(JPanelTesteProteinas jp, String seq) {
        ArrayList<Fasta> lf = new ArrayList<Fasta>();
        Fasta fasta = null;
        Extract xline = new Extract();

        String[] s = seq.split(">");
        jp.getjProgressBarLoadFiles().setValue(0);
        jp.getjProgressBarLoadFiles().setMaximum(s.length);

        for (int i = 1; i < s.length; i++) {
            jp.getjProgressBarLoadFiles().setValue(i);

            String prot = s[i];

            fasta = new Fasta();
            //String cod_proteina = xline.extract(prot, "|", "|", 1);
            String informacao = xline.extractInformacao(prot);
            informacao = informacao.replace(">gi", ">");
            String sequencia = xline.extractSequencia(prot);


            fasta.setCodProteina(informacao);
            fasta.setInformacao(informacao);
            fasta.setSequencia(sequencia);

            lf.add(fasta);

        }
        return lf;

    } // fim do metodo readreco

    public ArrayList<Fasta> go(File url, JPanelTesteProteinas jp) {

        ArrayList<Fasta> fastas = new ArrayList<Fasta>();

        if (url.isFile()) {
            String openArquivo = openArquivo(url);
            // fastas.add(readRecords());
            fastas.addAll(readRecordsMultiFasta(jp, openArquivo));

        } else {
            File[] arquivos = url.listFiles();
            for (int i = 0; i < arquivos.length; i++) {
                String openArquivo = openArquivo(arquivos[i]);
                //fastas.add(readRecords());
                fastas.addAll(readRecordsMultiFasta(jp, openArquivo));
            }
        }

        return fastas;
    }

    public ArrayList<Fasta> go(File url) {

        ArrayList<Fasta> fastas = new ArrayList<Fasta>();

        if (url.isFile()) {
            String openArquivo = openArquivo(url);
            // fastas.add(readRecords());
            fastas.addAll(readRecordsMultiFasta(openArquivo));

        } else {
            File[] arquivos = url.listFiles();
            for (int i = 0; i < arquivos.length; i++) {
                String openArquivo = openArquivo(arquivos[i]);
                //fastas.add(readRecords());
                fastas.addAll(readRecordsMultiFasta(openArquivo));
            }
        }

        return fastas;
    }
      
    private ArrayList<Fasta> readRecordsMultiFasta(String seq) {
        ArrayList<Fasta> lf = new ArrayList<Fasta>();
        Fasta fasta = null;
        Extract xline = new Extract();

        String[] s = seq.split(">gi");
        //System.out.println(size);

        for (int i = 1; i < s.length; i++) {

            String prot = s[i];

            fasta = new Fasta();
            String cod_proteina = xline.extract(prot, "|", "|", 1);
            String informacao = xline.extractInformacao(prot);
            String sequencia = xline.extractSequencia(prot);


            fasta.setCodProteina(cod_proteina);
            fasta.setInformacao(informacao);
            fasta.setSequencia(sequencia);
            lf.add(fasta);

        }
        return lf;
    } // fim do metodo readreco
   

    public String getArquivoCodProteinas(ArrayList<Fasta> l) {
        String st = "";
        for (int i = 0; i < l.size(); i++) {              
            st = st + l.get(i).getCodProteina() + "\n";
        }
        return st;
    }

    public String getArquivoTextoFasta(ArrayList<Fasta> l) {
        String st = "";
        for (int i = 0; i < l.size(); i++) {
            st += l.get(i).getFasta() + "\n";
        }
        return st;
    }

    /*****************************************************************************/
    public ArrayList<Fasta> goString(String seq) {

        ArrayList<Fasta> f = this.readMultiFastaString(seq);
        if (!f.isEmpty()) {
            return f;
        }

        return null;
    }

    private ArrayList<Fasta> readMultiFastaString(String seq) {
        ArrayList<Fasta> lf = new ArrayList<Fasta>();
        Fasta fasta = null;
        Extract xline = new Extract();

        String[] s = seq.split(">");
        for (int i = 1; i < s.length; i++) {

            String prot = s[i];

            fasta = new Fasta();
            //String cod_proteina = xline.extract(prot, "|", "|", 1);
            String informacao = xline.extractInformacao(prot);
            informacao = informacao.replace(">gi", ">");
            String sequencia = xline.extractSequencia(prot);


            fasta.setCodProteina(informacao);
            fasta.setInformacao(informacao);
            fasta.setSequencia(sequencia);
            lf.add(fasta);

        }
        return lf;


    } // fim do metodo readreco

    public String openArquivo(File url) {
        String stringEntrada = "";
        try {
            int size = (int) url.length();
            byte[] buffer = new byte[size];
            InputStream in = new FileInputStream(url);

            in.read(buffer);
            stringEntrada = new String(buffer).trim().toString();
            in.close();

        } catch (Exception ex) {
            Logger.getLogger(ProcessaFasta.class.getName()).log(Level.SEVERE, null, ex);
        }

        return stringEntrada;


    }
}
